package studentSystem;

import com.sun.org.apache.xerces.internal.impl.xs.XSComplexTypeDecl;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;

public class Login {
    public static void main(String[] args){
        ArrayList<User> list = new ArrayList<>();
        while (true) {
            System.out.println("---------------------欢迎来到学生管理系统------------------------------");
            System.out.println("请选择操作：1.登录   2.注册   3.忘记密码   4.退出系统");
            Scanner sc = new Scanner(System.in);
            String choose = sc.next();
            switch(choose){
                case "1" :
                    login(list);
                    break;
                case "2" :
                    register(list);
                    break;
                case "3" :
                    forget(list);
                    break;
                case "4" : {
                    System.out.println("退出系统， 欢迎下次使用！");
                    System.exit(0);
                }
                    break;
                default:
                    System.out.println("没有该操作，请重新选择！");
                    break;
            }
        }
    }

    //登录系统
    public static void login(ArrayList<User> list){
        System.out.println("-------------------登录系统-------------------");
        //1,键盘录入用户名
        //2,键盘录入密码
        //3,键盘录入验证码
        Scanner sc = new Scanner(System.in);
        for (int i=0; i<3; i++) {
            //用户名如果未注册，直接结束方法，并提示:用户名未注册，请先注册
            System.out.println("请输入用户名：");
            String name = sc.next();
            boolean flag = contains(list, name);
            if(!flag){
                System.out.println("用户名未注册，请先注册在登录!");
                return;
            }

            System.out.println("请输入密码：");
            String password = sc.next();

            //判断验证码是否正确，如不正确，重新输入
            while (true) {
                String code = getCode();
                System.out.println("正确的验证码："+code);
                System.out.println("请输入验证码：");
                String newcode = sc.next();
                if(!newcode.equalsIgnoreCase(code)){
                    System.out.println("验证码输入不正确，请重新输入!");
                }else{
                    break;
                }
            }

            //再判断用户名和密码是否正确，有3次机会
//            int index = containsName(list, name);
//            User u = list.get(index);
//            if(name.equals(u.getName()) && password.equals(u.getPassword())){
//                System.out.println("登录成功，可以开始使用学生管理系统了!");
//                break;
//            }else{
//                System.out.println("登录失败，用户名或密码不正确!");
//                if(i == 2){
//                    System.out.println("当前账号"+name+"被锁定，请联系客服解锁！");
//                    return;
//                }else {
//                    System.out.println("当前账号" + name + "还剩" + (2 - i) + "次机会！");
//                }
//            }
            User u = new User(name, password, null, null);
            boolean result = checkuserInfo(list, u);
            if(result){
                System.out.println("登录成功，可以开始使用学生管理系统了!");
                StudentSystem ss = new StudentSystem();
                ss.startStudentSystem();
                break;
            }else{
                System.out.println("登录失败，用户名或密码不正确!");
                if(i == 2){
                    System.out.println("当前账号"+name+"被锁定，请联系客服解锁！");
                    return;
                }else {
                    System.out.println("当前账号" + name + "还剩" + (2 - i) + "次机会！");
                }
            }
        }
    }

    //注册系统
    public static void register(ArrayList<User> list){
        System.out.println("-------------------注册系统------------------");
        //1,用户名验证
        Scanner sc = new Scanner(System.in);
        String name, password, idcard, telephone;
        while (true) {
            System.out.println("请重新输入用户名：");
            name = sc.next();

            //用户名长度必须在3~15位之间
            //只能是字母加数字的组合，但是不能是纯数字
            boolean flag = checkName(name);
            if(!flag){
                continue;
            }
            //用户名唯一
            boolean flag2 = contains(list, name);
            if(flag2){
                System.out.println("用户名"+name+"已存在,请重新输入！");
            }else{
                System.out.println("用户名"+name+"可用！");
                break;
            }
        }

        //2,密码键盘输入两次，两次一致才可以进行注册。
        while (true) {
            System.out.println("请输入注册密码：");
            password = sc.next();
            System.out.println("请再次输入注册密码：");
            String password2 = sc.next();
            if(password.equals(password2)){
                break;
            }
            System.out.println("两次输入密码不一致，请重新输入！");
        }

        //3，身份证号码验证
        while (true) {
            System.out.println("请输入身份证号码：");
            idcard = sc.next();
            boolean flag = checkIdcard(idcard);
            if(flag){
                break;
            }
        }

        //4,手机号验证
        while (true) {
            System.out.println("请输入手机号：");
            telephone = sc.next();
            boolean flag = checkTelephone(telephone);
            if(flag){
                break;
            }
        }

        User user = new User(name, password, idcard, telephone);
        list.add(user);
        System.out.println("用户"+name+"注册成功！");

    }

    //忘记密码
    public static void forget(ArrayList<User> list){
        System.out.println("-------------------忘记密码-------------------");
        //1，键盘录入用户名，判断当前用户名是否存在，如不存在，直接结束方法，并提示:未注册
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入用户名：");
        String name = sc.next();
        int index = containsName(list, name);
        if(index == -1){
            System.out.println("当前用户"+name+"未注册，请先注册！");
            return;
        }

        //2，键盘录入身份证号码和手机号码
        System.out.println("请输入身份证号：");
        String idcard = sc.next();
        System.out.println("请输入手机号：");
        String tele = sc.next();

        //3，判断当前用户的身份证号码和手机号码是否一致，
        //如果一致，则提示输入密码，进行修改。
        //如果不一致，则提示:账号信息不匹配，修改失败。
        User u = list.get(index);
        if(!(idcard.equals(u.getIdcard()) && tele.equals(u.getTelephone()))){
            System.out.println("身份证号或手机号输入有误，修改失败！：");
            return;
        }

        while (true) {
            System.out.println("请输入新的密码：");
            String password = sc.next();
            System.out.println("请再次输入新的密码：");
            String againPassword = sc.next();
            if(password.equals(againPassword)){
                System.out.println("用户"+name+"修改密码成功！");
                u.setPassword(password);
                break;
            }else{
                System.out.println("两次密码输入不一致， 请重新输入！");
            }
        }
    }

    //验证用户信息
    private static boolean checkuserInfo(ArrayList<User> list, User u) {
        for (int i = 0; i < list.size(); i++) {
            User ul = list.get(i);
            if(u.getName().equals(ul.getName()) && u.getPassword().equals(ul.getPassword())){
                return true;
            }
        }
        return false;
    }
    //手机号验证
    public static boolean checkTelephone(String telephone){
        //长度为11位
        if(telephone.length() != 11){
            System.out.println("手机号长度必须为11位，请重新输入!");
            return false;
        }

        //不能以0为开头
        if(telephone.charAt(0) == '0'){
            System.out.println("手机号不能以0为开头，请重新输入!");
            return false;
        }

        //必须都是数字
        for(int i=0; i<telephone.length(); i++){
            char c = telephone.charAt(i);
            if(c < '0' || c > '9'){
                System.out.println("手机号必须都是数字，请重新输入!");
                return false;
            }
        }
        return true;
    }
    //身份证号验证
    public static boolean checkIdcard(String idcard){
        //长度为18位
        if(idcard.length() != 18){
            System.out.println("身份证号码长度必须为18位，请重新输入!");
            return false;
        }

        //不能以0为开头
        if(idcard.charAt(0) == '0'){
            System.out.println("身份证号码不能以0为开头，请重新输入!");
            return false;
        }
        //前17位，必须都是数字
        for(int i=0; i<idcard.length()-1; i++){
            char c = idcard.charAt(i);
            if(c < '0' || c > '9'){
                System.out.println("身份证号码前17位必须都是数字，请重新输入!");
                return false;
            }
        }

        //最为一位可以是数字，也可以是大写X或小写x
        char c = idcard.charAt(17);
        if((c > '0' && c < '9' ) || c == 'X' || c == 'x'){
            return true;
        }else{
            return false;
        }

    }
    //用户名验证
    public static boolean checkName(String name){
        if(name.length()<3 || name.length()>15) {
            System.out.println("用户名长度未在3~15位之间，请重新输入！");
            return false;
        }

        for(int i=0; i<name.length(); i++){
            char c = name.charAt(i);
            if( !((c >= 'a' && c <= 'z')||( c>= 'A' && c <= 'Z')||(c >= '0' && c <= '9')) ){
                System.out.println("用户名只能是字母加数字的组合，请重新输入！");
                return false;
            }
        }

        for(int i=0; i<name.length(); i++){
            char c = name.charAt(i);
            if( (c >= 'a' && c <= 'z')||( c>= 'A' && c <= 'Z') ){
                return true;
            }
        }
        System.out.println("用户名不能是纯数字，请重新输入！");
        return false;
    }
    //检查用户名是否存在
    public static boolean contains(ArrayList<User> list, String name){

        return containsName(list, name) >= 0;
    }
    //生成验证码
    public static String getCode(){
        //长度为5
        //由4位大写或者小写字母和1位数字组成，同-一个字母可重复
        //数字可以出现在任意位置
        ArrayList<Character> list = new ArrayList<>();
        for (int i = 0; i < 26; i++) {
            list.add((char)('a' + i));
            list.add((char)('A' + i));
        }

        StringBuilder sb = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i < 4; i++) {
            int index = r.nextInt(list.size());
            char c = list.get(index);
            sb.append(c);
        }

        int num = r.nextInt(10);
        sb.append(num);

        char[] arr = sb.toString().toCharArray();
        int index = r.nextInt(arr.length);
        char tmp = arr[arr.length-1];
        arr[arr.length-1] = arr[index];
        arr[index] = tmp;

        return new String(arr);
    }
    //返回用户名index
    public static int containsName(ArrayList<User> list, String name){
        for (int i = 0; i < list.size(); i++) {
            User u = list.get(i);
            String u_name = u.getName();
            if(name.equals(u_name)){
                return i;
            }
        }
        return -1;
    }
}
